iT邦幫忙

2023 iThome 鐵人賽

DAY 29
0
自我挑戰組

自己的 Leak, 自己抓(swift)系列 第 29

虛驚一場 Capture List

  • 分享至 

  • xImage
  •  

今天剛好在 X 看到有人出問題

請解釋下面的 code 為何不能 compile


最後作者拋出 swift 文件 Capture List

過程中

也順便解了 struct 被 implict capture 之後,

後續會發生什麼的問題

Capture struct

Explicit capture [a]

先來談談 [a],他的作用類似於在 inner scope let innerA = outerA

因此 innerAouterA 是兩個不同的個體

Implicit capture b

b 的話則會 ref 到原本的 outerB

因此整份 code 其實只有一個 b

final func testStructCaptureList() {
    var a = 0
    var b = 0
    let closure = { [a] in
      return (a, b)
    }
    a = 10
    b = 10
    let (na, nb) = closure()
    XCTAssertEqual(na, 0)
    XCTAssertEqual(nb, 10)
}

Capture class

class 的情況不管是 Explicit/Implicit capture

其結果都是一樣的

(內心 OS 一下,還以為前面的等價 code 都寫錯了)

class SimpleClass {
      var value: Int = 0
}

func testClassCaptureList() {
    var x = SimpleClass()
    var y = SimpleClass()
    let closure = { [x] in
      return (x.value, y.value)
    }

    x.value = 10
    y.value = 10
    let (na, nb) = closure()
    XCTAssertEqual(na, 10)
    XCTAssertEqual(nb, 10)
}  

最終的答案

X


上一篇
概念驗證 Test Leak
下一篇
結語
系列文
自己的 Leak, 自己抓(swift)30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言